
#include "nane/InputSystem/InputSystemImpl_.h"

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    InputSystem::Implementation::Implementation()
        : windowHandle( NULL )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    InputSystem::Implementation::~Implementation()
    {
        for( TInputDeviceSystemVector::iterator it = inputDevices.begin(), it_end = inputDevices.end();
                it != it_end;
                ++it )
        {
            (*it)->Shutdown();
            delete (*it);
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void InputSystem::Implementation::LoadModule( const ModulePtr& _module )
    {
        InputDeviceSystem* inputDeviceSystem = new InputDeviceSystem();
        if( inputDeviceSystem->Initialize(_module) == true )
        {
            inputDevices.push_back(inputDeviceSystem);
        }
        else
        {
            delete inputDeviceSystem;
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void InputSystem::Implementation::AddActionBinding( const char* _action, const InputBinding& _inputBinding, uint32 _modifiersCount, const InputBindingModifier* _modifiers )
    {
        Implementation::TInputActionVector::iterator it_find = 
        std::find_if(inputActions.begin(), inputActions.end(), FindAction(_action));
        if( it_find != inputActions.end() )
        {
            it_find->second.AddInputBinding(_inputBinding, _modifiersCount, _modifiers);
        }
        else
        {
            InputAction inputAction;
            inputAction.AddInputBinding(_inputBinding, _modifiersCount, _modifiers);
            inputActions.push_back(std::make_pair(std::string(_action), inputAction));
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
